/* 
    扫描器类
*/
export default class {
    // templateStr：模板字符串
    constructor(templateStr) {
        this.templateStr = templateStr;
        // console.log('I is ', templateStr)

        // 指针，一开始是指向模板字符串的开始位置。
        this.pos = 0;

        // 尾巴。剩余字符串。表示指针之后的字符串。一开始就是全部模板字符串
        this.tail = templateStr;
    }

    /* 
       这个方法功能比较单一，就是直接过滤掉指定内容（比如{{或}}）。没有返回值
        @stopTag {String} 指定内容（比如{{或}}）。用于循环中，当扫描到指定内容时，停止循环。
    */
    scan(stopTag) {
        if (this.tail.indexOf(stopTag) == 0) {
            // 直接过滤掉指定内容的长度的字符串，让指针相应的增加。
            this.pos += stopTag.length;
            // 同时改变尾巴。
            this.tail = this.templateStr.substr(this.pos);
        }
    }

    /* 
        让指针进行扫描，直到遇见指定内容（比如{{或}}）结束，并且能够返回结束之前扫描过的文字
        @stopTag {String} 指定内容（比如{{或}}）。用于循环中，当扫描到指定内容时，停止循环。
    */
    scanUtil(stopTag) {
        // 记录当前方法执行时pos的值
        var pos_backup = this.pos;
        // 当尾巴的开头不是stopTag的时候，就说明还没有扫描到stopTag
        // 且条件是防止死循环
        while (this.tail.indexOf(stopTag) != 0 && this.pos < this.templateStr.length) {
            this.pos++;
            // 改变尾巴内容，使其从当前指针指向的这个字符开始，直到最后
            this.tail = this.templateStr.substr(this.pos);
        }
        return this.templateStr.substring(pos_backup, this.pos)
    }

    // 判断扫描是否结束
    eos() {
        return this.pos >= this.templateStr.length;
    }
}